March 08, 2021
(-)
, 밑줄(_)
로만 작성
컴포넌트파일이나 각종 훅들을 종종 대문자로 시작하는 경우가 있었는데, 모두 수정해야겠다.. 사실상 이것도 일정하지않고 어떤건 소문자 어떤건 대문자 이러긴 했음..
한줄은 생략해도 된다는 말도 있는걸 보면 좀 케바케인듯..?
if (true) doSomething()
if (true) {
doSomething()
}
가독성을 위해서라면 한줄 띄어쓰는것이 좋은듯?
switch (animal) {
case Animal.BANDERSNATCH:
handleBandersnatch()
break
case Animal.JABBERWOCK:
handleJabberwock()
break
default:
throw new Error('Unknown animal')
}
근데 사실상 이 문제는,
.
의 위치가 잘못되면 어차피 에러발생이라 어느정도 수준까지의 체인이 적당한지가 관점일듯 함..
const leds = stage
.selectAll('.led')
.data(data)
.enter()
.append('svg:svg')
.classed('led', true)
.attr('width', (radius + margin) * 2)
.append('svg:g')
.attr('transform', `translate(${radius + margin},${radius + margin})`)
.call(tron.led)
한 줄이 80자를 넘기면 안된다.
이것을 기준으로 위의 메소드체인도 컷팅하면 될 듯 하다.
각 구문사이는 줄 공백을 주는것이 좋다.
const a = 1
const b = 3
모든 변수는 상단에 위치해야 보기 편할거라 생각해왔었는데, 그것이 아니라 사용하는 부분 바로 전에 입력하는게 보기 좋다고 한다.. 아아…
function(hasName){
const name = getName();
if(!hasName){
return false;
}
this.setFirstName(name);
return true;
}
function(hasName){
if(!hasName){
return false;
}
const name = getName();
this.setFirstName(name);
return true;
}
const
를 먼저 묶고, let
을 묶어준다.let i
const items = getItems()
let dragonball
const goSportsTeam = true
let len
const goSportsTeam = true
const items = getItems()
let dragonball
let i
let length
객체에 있어서 속성은 어떠한 경우에도 이후 추가되는것이 아닌, 초기에 생성되어있어야 하는것 같음
function getKey(k) {
return `a key named ${k}`
}
const obj = {
id: 5,
name: 'San Francisco',
}
obj[getKey('enabled')] = true
function getKey(k) {
return `a key named ${k}`
}
const obj = {
id: 5,
name: 'San Francisco',
[getKey('enabled')]: true,
}
아니면 함수 선언식 사용?
또한, 기본값을 갖고있는 파라미터를 뒤쪽으로 미뤄둔다.
function handleThings(opts) {
opts = opts || {}
}
function handleThings(opts) {
if (opts === void 0) {
opts = {}
}
}
function handleThings(opts = {}) {
// ...
}
function handleThings(val, opts = {}) {
// ...
}
사이드 이펙트가 발생할 수 있는 파라미터의 기본값 사용을 지양한다.
사이드 이펙트 : 외부영역에 영향을 주는 것. 필요하다면 클로저 사용
사이드 이펙트는 좀 더 다뤄볼 예정
var b = 1
function count(a = b++) {
console.log(a)
}
count() // 1
count() // 2
count(3) // 3
count() // 3
헐..
this.__firstName__ = 'Panda'
this.firstName_ = 'Panda'
this._firstName = 'Panda'
this.firstName = 'Panda'
this
는 변수의 값으로 사용하지 않으며, 필요하다면 화살표 함수로 작성한다.
가독성을 위해 축약문은 모두 대문자로 표기한다.
const HttpRequests = null
const HTTPRequests = null
export
되는 파일 내 모든 상수(const)
는 모두 대문자로 표기한다.export const Test_Variable = null
export const TEST_VARIABLE = null
let del_notes = ['one', 'two']
let delivery_note_list = ['one', 'two']
export
를 제외한 변수, 상수, 함수, 객체의 경우 lowerCamelCase
로 표기한다습관적으로 많이 사용하지만, 성능, 디버깅 유지보수 가독성에 부정적인 영향을 주기 때문에 피해야 하는 패턴들이다.
객체에서는 상관없지만 배열의 경우 delete
를 사용하더라도 undefined
로 공간을 차지하고 있는 상태이기 때문에, splice
메소드를 사용하는것이 좋다.
querySelector
와 같은 돔을 탐색할 때, 동일한 돔을 여러번 탐색하는것은 성능 저하를 유발하기 때문에 캐싱하는것이 좋다.
const className = document.getElementById('result').className
const clientHeight = document.getElementById('result').clientHeight
const scrollTop = document.getElementById('result').scrollTop
document.getElementById('result').blur()
const el = document.getElementById('result')
const { className, clientHeight, scrollTop } = el
el.blur()
innerHTML
이나 appendChild
메소드는 사용할 때마다 돔 변경이 발생한다. 돔 변경은 할 때마다 비용이 들기 때문에, 한번에 일괄 해주는것이 좋다.
myBookmarks.forEach(bookmark => {
el.innerHTML += `<li><a href="${bookmark.url}">${bookmark.name}</a></li>`
})
const html = myBookmarks
.map(bookmark => `<li><a href="${bookmark.url}">${bookmark.name}</a></li>`)
.join('')
el.innerHTML = html
바닐라 자바스크립트 뿐만 아니라 React
와 같은 경우도 인라인으로 함수를 작성하는 것이 아닌, useCallback
으로 메소드를 선언하고 그 메소드만 묶어준다.
VScode
의 prettier
를 사용하면 세미콜론이나 디스트럭처링 내 띄어쓰기 등 작은 부분들은 저장할 때 일 괄 수정해주는 좋은 모듈? 이 있더라 !